package com.mimosa.common.eucpsdk;

import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.List;

import com.mimosa.common.eucpsdk.Mo;
import com.mimosa.common.eucpsdk.SDKServiceBindingStub;
import com.mimosa.common.eucpsdk.SDKServiceLocator;
import com.mimosa.common.eucpsdk.StatusReport;

/**
 * 亿美短信SDK函数封装类
 * 
 * @author wangchao
 *
 */
public class Client {
	private String softwareSerialNo;
	private String key;
	private String password;

	public Client(String sn, String key, String password) {
		this.softwareSerialNo = sn;
		this.key = key;
		this.password = password;
		init();
	}

	SDKServiceBindingStub binding;

	public void init() {
		try {
			binding = (SDKServiceBindingStub) new SDKServiceLocator()
					.getSDKService();
		} catch (javax.xml.rpc.ServiceException jre) {
			if (jre.getLinkedCause() != null)
				jre.getLinkedCause().printStackTrace();
		}
	}

	/**
	 * 帐号充值
	 * 
	 * @param cardNo
	 * @param cardPass
	 * @return
	 * @throws RemoteException
	 */
	public int chargeUp(String cardNo, String cardPass) throws RemoteException {
		int value = -1;
		value = binding.chargeUp(softwareSerialNo, key, cardNo, cardPass);
		return value;
	}

	/**
	 * 余额查询
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public double getBalance() throws RemoteException {
		double value = 0.0;
		value = binding.getBalance(softwareSerialNo, key);
		return value;
	}

	/**
	 * 获取发送一条短信所需要的费用
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public double getEachFee() throws RemoteException {
		double value = 0.0;
		value = binding.getEachFee(softwareSerialNo, key);
		return value;
	}

	/**
	 * 1、从EUCP平台接收手机用户上行的短信 2、返回值list中的每个元素为一个Mo对象 4、Mo具体数据结构参考使用手册
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public List<Mo> getMO() throws RemoteException {
		Mo[] mo = binding.getMO(softwareSerialNo, key);

		if (null == mo) {
			return null;
		} else {
			List<Mo> molist = Arrays.asList(mo);
			return molist;
		}
	}

	/**
	 * 获取状态报告信息
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public List<StatusReport> getReport() throws RemoteException {
		StatusReport[] sr = binding.getReport(softwareSerialNo, key);
		if (null != sr) {
			return Arrays.asList(sr);
		} else {
			return null;
		}
	}

	/**
	 * 注销
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public int logout() throws RemoteException {
		int value = -1;
		value = binding.logout(softwareSerialNo, key);
		return value;
	}

	/**
	 * 企业详细信息注册 registDetailInfo(String eName, String linkMan, String
	 * phoneNum,String mobile, String email, String fax, String address,String
	 * postcode) 1、eName 企业名称(最多60字节) 2、linkMan 联系人姓名(最多20字节) 3、phoneNum
	 * 联系电话(最多20字节) 4、mobile 联系手机(最多15字节) 5、email 电子邮件(最多60字节) 6、fax
	 * 联系传真(最多20字节) 7、address 公司地址(最多60字节) 8、postcode 邮政编码(最多6字节)
	 * 9、以上参数信息都必须填写、每个参数都不能为空
	 */
	public int registDetailInfo(String eName, String linkMan, String phoneNum,
			String mobile, String email, String fax, String address,
			String postcode) throws RemoteException {
		int value = -1;
		value = binding.registDetailInfo(softwareSerialNo, key, eName, linkMan,
				phoneNum, mobile, email, fax, address, postcode);
		return value;
	}

	/**
	 * 激活序列号,初次使用、已注销后再次使用时调用该方法.
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public int registEx() throws RemoteException {
		int value = -1;
		value = binding.registEx(softwareSerialNo, key, password);
		return value;
	}

	/**
	 * 发送短信、可以发送定时和即时短信 sendSMS(String[] mobiles,String smsContent, String
	 * addSerial, int smsPriority) 1、mobiles 手机数组长度不能超过1000 2、smsContent
	 * 最多500个汉字或1000个纯英文
	 * 、请客户不要自行拆分短信内容以免造成混乱、亿美短信平台会根据实际通道自动拆分、计费以实际拆分条数为准、亿美推荐短信长度70字以内
	 * 3、addSerial 附加码(长度小于15的字符串) 用户可通过附加码自定义短信类别,或添加自定义主叫号码( 联系亿美索取主叫号码列表)
	 * 4、优先级范围1~5，数值越高优先级越高(相对于同一序列号) 5、其它短信发送请参考使用手册自己尝试使用
	 */
	public int sendSMS(String[] mobiles, String smsContent, String addSerial,
			int smsPriority) throws RemoteException {
		int value = -1;
		value = binding.sendSMS(softwareSerialNo, key, "", mobiles, smsContent,
				addSerial, "gbk", smsPriority, 0);
		return value;
	}

	/**
	 * 发送定时短信 sendScheduledSMSEx(String[] mobiles, String smsContent,String
	 * sendTime,String srcCharset) 1、mobiles 手机数组长度不能超过1000 2、smsContent
	 * 最多500个汉字或1000个纯英文
	 * 、请客户不要自行拆分短信内容以免造成混乱、亿美短信平台会根据实际通道自动拆分、计费以实际拆分条数为准、亿美推荐短信长度70字以内
	 * 3、sendTime 定时短信发送时间 定时时间格式为：年年年年月月日日时时分分秒秒，例如20090801123030
	 * 表示2009年8月1日12点30分30秒该条短信会发送到用户手机 4、srcCharset 字符编码，默认为"GBK"
	 * 5、其它定时短信发送请参考使用手册自己尝试使用
	 */
	public int sendScheduledSMSEx(String[] mobiles, String smsContent,
			String sendTime, String srcCharset) throws RemoteException {
		int value = -1;
		value = binding.sendSMS(softwareSerialNo, key, sendTime, mobiles,
				smsContent, "", srcCharset, 3, 0);
		return value;
	}

	/**
	 * 发送带有信息ID的短信（可查状态报告） sendSMSEx(mobiles, smsContent, addSerial, srcCharset,
	 * smsPriority, smsID) 1、mobiles 手机数组长度不能超过1000 2、smsContent
	 * 最多500个汉字或1000个纯英文
	 * 、请客户不要自行拆分短信内容以免造成混乱、亿美短信平台会根据实际通道自动拆分、计费以实际拆分条数为准、亿美推荐短信长度70字以内
	 * 3、addSerial 附加码(长度小于15的字符串) 用户可通过附加码自定义短信类别,或添加自定义主叫号码( 联系亿美索取主叫号码列表)
	 * 4、srcCharset 字符编码，默认为"GBK" 5、优先级范围1~5，数值越高优先级越高(相对于同一序列号)
	 * 6、信息ID，此ID可以与查询查询状态报告的方法中对照发送信息的状态（成功，失败） 7、其它定时短信发送请参考使用手册自己尝试使用
	 */
	public int sendSMSEx(String[] mobiles, String smsContent, String addSerial,
			String srcCharset, int smsPriority, long smsID)
			throws RemoteException {
		int value = -1;
		value = binding.sendSMS(softwareSerialNo, key, "", mobiles, smsContent,
				addSerial, srcCharset, smsPriority, smsID);
		return value;
	}

	/**
	 * key 用户自定义key值， 长度不超过15个字符字，和软件序列号注册时的关键字保持一致 sendTime
	 * 定时语音验证码的定时时间，格式为:年年年年月月日日时时分分秒秒,例如:20090504111010 代表2009年5月4日
	 * 11时10分10秒，语音验证码会在指定的时间发送出去 sendTime值为空时，为即时发送语音验证码
	 * sendTime值不为空时，为定时发送语音验证码 通常实际应用中使用到的是即时语音验证码，使用时可设置为null mobiles
	 * 手机号码(字符串数组,最多为200个手机号码) 通常实际应用中只用到了单号码语音验证码,即采用单一手机号码发送 checkCode
	 * 语音验证码(最多不要超过6个字符，最少不要小于4个字符;字符必须为0至9的全英文半角数字字符) addSerial
	 * 发送语音验证码时此项无实际意义可设定为null srcCharset 字符编码，默认为"GBK" smsPriority
	 * 语音验证码等级，范围1~5，数值越高优先级越高 smsID
	 * 语音验证码序列ID，自定义唯一的序列ID，数字位数最大19位，与状态报告ID一一对应，需用户自定义ID规则确保ID的唯一性
	 * 。如果smsID为0将获取不到相应的状态报告信息。
	 * 该参数与短信smsID作用相同仅在语音验证码支持状态报告时有实际意义,与之对应的语音状态报告与短信状态报告接口共用。
	 */
	public String sendVoice(String[] mobiles, String smsContent,
			String addSerial, String srcCharset, int smsPriority, long smsID)
			throws RemoteException {
		String value = null;
		value = binding.sendVoice(softwareSerialNo, key, "", mobiles,
				smsContent, addSerial, srcCharset, smsPriority, smsID);
		return value;
	}

	/**
	 * 修改软件序列号密码、注意修改软件序列号密码以后不需要重新注册(激活) serialPwdUpd(String serialPwd, String
	 * serialPwdNew) 1、serialPwd 旧密码 2、serialPwdNew 新密码、长度为6位的数字字符串
	 */
	public int serialPwdUpd(String serialPwd, String serialPwdNew)
			throws RemoteException {
		int value = -1;
		value = binding.serialPwdUpd(softwareSerialNo, key, serialPwd,
				serialPwdNew);
		return value;
	}
}
